import tensorflow as tf

# 博客 https://blog.csdn.net/NNNNNNNNNNNNY/article/details/70177509
"""

    平滑平均模型：可以训练处的模型毛刺削平，使得预测结果更加健壮。
    
    
    maintain_average_op:    
        用于参数赋值后，更新v1的滑动平均值操作
        
    ExponentialMovingAverage：
        获得滑动平均模型
        
    ema.average(v1) ：
        得到v1的滑动平均值
    
"""
if __name__ == '__main__':
    v1 = tf.Variable(0, dtype=tf.float32)
    step = tf.Variable(0, dtype=tf.float32)

    ema = tf.train.ExponentialMovingAverage(0.99, step)

    # 定义一个更新变量滑动平均的操作，每次执行这个操作时参数中的变量都会被更新
    maintain_average_op = ema.apply([v1])

    with tf.Session() as session:
        session.run(tf.global_variables_initializer())
        print(session.run([v1, ema.average(v1)]))

        # 赋值后,更新滑动平均值maintain_average_op  0.0 -> 3.6
        session.run(tf.assign(v1, 4))
        # 更新v1的滑动平均值
        session.run(maintain_average_op)
        print(session.run([v1, ema.average(v1)]))

        # 赋值后,更新滑动平均值maintain_average_op  3.6 -> 3.6327271
        session.run(tf.assign(v1, 4))
        session.run(tf.assign(step, 100))
        # 更新v1的滑动平均值
        session.run(maintain_average_op)
        print(session.run([v1, ema.average(v1)]))

